﻿/*********************************************************
 * 开发人员：小兵
 * 创建时间：2012-10-8 16:16:39
 * 描述说明：
 * 
 * 更改历史：
 * 
 * *******************************************************/
namespace Mozlite.Data.Components.Structures
{
    using System;
    using System.Web;
    using System.Data;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;

    /// <summary>
    /// 默认表格。
    /// </summary>
    public class Table : ITable
    {
        private List<IField> fields;

        /// <summary>
        /// 初始化类<see cref="Table"/>。
        /// </summary>
        /// <param name="name">表格名称。</param>
        public Table(string name)
        {
            if(String.IsNullOrEmpty(name))
                throw new ArgumentNullException("name");

            Name = name;
            fields = new List<IField>();
        }

        /// <summary>
        /// 获取或设置表格名称。
        /// </summary>
        public virtual string Name { get; protected set; }
        
        /// <summary>
        /// 添加一列。
        /// </summary>
        /// <param name="field">列实例对象。</param>
        public virtual void AddField(IField field)
        {
            if(field == null)
                throw new ArgumentNullException("field");
            if(FindField(field.Name) != null)
                throw new ArgumentException("A field named '{0}' already exists in table '{1}'.".FormatWith(field.Name, this.Name));
            fields.Add(field);
        }
        
        /// <summary>
        /// 新建一列。
        /// </summary>
        /// <param name="name">列名称。</param>
        /// <param name="dataType">类型。</param>
        /// <returns>返回列实例。</returns>
        public virtual IField CreateField(string name, Type dataType)
        {
            return CreateField(name, dataType, 0);
        }

        /// <summary>
        ///新建一列。
        /// </summary>
        /// <param name="name">列名称。</param>
        /// <param name="dataType">类型。</param>
        /// <param name="properties">列属性。</param>
        /// <returns>返回列实例。</returns>
        public virtual IField CreateField(string name, Type dataType, FieldProperties properties)
        {
            return CreateField(name, dataType, 0, properties);
        }
        
        /// <summary>
        ///新建一列。
        /// </summary>
        /// <param name="name">列名称。</param>
        /// <param name="dataType">类型。</param>
        /// <param name="size">列大小。</param>
        /// <returns>返回列实例。</returns>
        public virtual IField CreateField(string name, Type dataType, int size)
        {
            return CreateField(name, dataType, size, FieldProperties.None);
        }
        
        /// <summary>
        ///新建一列。
        /// </summary>
        /// <param name="name">列名称。</param>
        /// <param name="dataType">类型。</param>
        /// <param name="size">列大小。</param>
        /// <param name="properties">列属性。</param>
        /// <returns>返回列实例。</returns>
        public virtual IField CreateField(string name, Type dataType, int size, FieldProperties properties)
        {
            return new Field(name, dataType, size, properties);
        }
        
        /// <summary>
        /// 查找列实例。
        /// </summary>
        /// <param name="name">列名。</param>
        /// <returns>返回列实例，如果不存在返回<c>null</c>。</returns>
        public IField FindField(string name)
        {
            return FindField(f => f.Name == name);
        }
        
        /// <summary>
        /// 查找列实例。
        /// </summary>
        /// <param name="matcher">匹配调试器。</param>
        /// <returns>如果有匹配列，返回第一个匹配得到的列实例，否则返回<c>null</c>。</returns>
        public IField FindField(Predicate<IField> matcher)
        {
            foreach(IField field in this)
                if(matcher(field))
                    return field;
            return null;
        }
        
        /// <summary>
        /// 查找列实例。
        /// </summary>
        /// <param name="matcher">匹配调试器。</param>
        /// <returns>返回匹配的所有列。</returns>
        public IList<IField> FindFields(Predicate<IField> matcher)
        {
            List<IField> matchingFields = new List<IField>();
            foreach(IField field in this)
                if(matcher(field))
                    matchingFields.Add(field);
            return matchingFields;
        }

        /// <summary>
        /// 重写叠代循环接口。
        /// </summary>
        /// <returns>
        /// 返回<see cref="T:System.Collections.Generic.IEnumerator`1"/>叠代集合实例。
        /// </returns>
        public virtual IEnumerator<IField> GetEnumerator()
        {
            return fields.GetEnumerator();
        }

        /// <summary>
        /// 重写叠代循环接口。
        /// </summary>
        /// <returns>
        /// 返回<see cref="T:System.Collections.Generic.IEnumerator"/>叠代集合实例。
        /// </returns>
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        /// <summary>
        /// 返回表格指示字符串。
        /// </summary>
        /// <returns>
        /// 返回表格指示字符串。
        /// </returns>
        public override string ToString()
        {
            return "{0} ({1} fields)".FormatWith(Name, fields.Count);
        }
    }
}
